#include<iostream>
using namespace std;

#include"tvectorporo.h"

   TVectorPoro::TVectorPoro()
   {
      dimension=0;
      datos = NULL;
   }
      TVectorPoro::TVectorPoro(int n)
   {
      TPoro vacio;
      if( n <= 0 )
      {
         dimension=0;
         datos=NULL;
      }
      else
      {
         dimension = n;
         datos = new TPoro[n];
         if( datos == NULL )
         {
            dimension=0;
         }else
         {
            for(int i=0; i < dimension; i++)
            {
               datos[i] = vacio;
            }
         }

      }
   }
   TVectorPoro::TVectorPoro(const TVectorPoro& v)
   {
      dimension = v.dimension;
      datos = new TPoro[dimension];
      if( datos == NULL )
      {
         dimension = 0;
      }else
      {
         for( int i=0; i < dimension; i++)
         {
            datos[i] = v.datos[i];
         }
      }
   }
   TVectorPoro::~TVectorPoro()
   {
      if(datos)delete[] datos;
      dimension=0;
      datos = NULL;


   }
   TVectorPoro& TVectorPoro::operator=(const TVectorPoro& v)
   {
      if(this != &v )
      {
         if( dimension != v.dimension )
         {
            dimension = v.dimension;
            if( datos != NULL)
            {
               delete[] datos;
            }
            datos = new TPoro[dimension];
            if( datos == NULL )
            {
               dimension = 0;
               return *this;
            }
         }
         for( int i=0; i < dimension; i++)
         {
            datos[i] = v.datos[i];
         }
      }
      return *this;
   }
   bool TVectorPoro::operator==(const TVectorPoro& v)
   {
      bool igual=true;
      if( dimension != v.dimension )
      {
         igual= false;
      }else
      {
         for( int i=0; i < dimension; i++)
         {
            if( datos[i] != v.datos[i] )
            {
               igual= false;
            }
         }
      }
      return igual;
   }
   bool TVectorPoro::operator!=(const TVectorPoro& v)
   {
      if( (*this) == v )
      {
         return false;
      }else
      {
         return true;
      }
   }
   TPoro& TVectorPoro::operator[](int n)
   {

      if( n >= 1 && n <= dimension )
      {

         return datos[n-1];

      }else
      {
         return error;
      }
   }
   TPoro TVectorPoro::operator[](int n) const
   {
      TPoro aux;
      if( n >= 1 && n <= dimension )
      {
         aux = datos[n-1];
      }else
      {
         aux = error;
      }
      return aux;
   }
   int TVectorPoro::Longitud() const
   {
      return dimension;
   }
   void TVectorPoro::SetLongitud(int n)
   {
      dimension = n;
   }
   int TVectorPoro::Cantidad() const
   {
      int cont=0;
      for( int i=0; i < dimension; i++ )
      {
         if( datos[i].EsVacio() == false)
         {
            cont++;

         }
      }
      return cont;
   }
   bool TVectorPoro::Redimensionar(int n)
   {
      if( n <= 0 || dimension == n )
      {
         return false;
      }else
      {
       /*if( n > dimension )
        {
            TVectorPoro grande(n);
            for( int i=0; i < dimension; i++)
            {
               grande.datos[i] = datos[i];
            }
            (*this) = grande;
         }else
         {
            TVectorPoro pequeno(n);
            for( int i=0; i < n; i++)
            {
               pequeno.datos[i] = datos[i];
            }
            (*this) = pequeno;*/
         TPoro datos2[dimension];
         int dimension2=dimension;
         for(int i=0; i<dimension; i++)datos2[i]=datos[i];
         delete[] datos;
         dimension=n;
         datos = new TPoro[dimension];
         for(int i=0; i<dimension && i<dimension2; i++)
         {
            datos[i]=datos2[i];
         }


         //~ }
         return true;
      }
   }
   ostream & operator<<(ostream& os,const TVectorPoro& v)
   {
      if ( v.dimension == 0 )
      {
         os<<"[]"<<endl;
      }else
      {
         for(int i=0; i < v.dimension; i++)
         {
            if( i==0 )
            {
               os<<"[";
            }
            os<<i+1<<" "<<v.datos[i];
            if(i == v.dimension-1 )
            {
               os<<"]";
            }else
       {
          os<<" ";
       }
         }
      }
      return os;
   }


